//package com.guaoran.micro.services.spring.cloud.client.controller;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.client.ServiceInstance;
//import org.springframework.cloud.client.discovery.DiscoveryClient;
//import org.springframework.context.annotation.Bean;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @author : gucheng
// * @Description : <br/>
// * @date :2018/12/2 13:00
// */
//@RestController
//public class ClientController {
//    @Value("${spring.application.name}")
//    private String currentServiceName;
//
//    @Autowired
//    private DiscoveryClient discoveryClient;
//    @Autowired
//    private RestTemplate restTemplate;
//
//
//
//    // Map Key service Name , Value URLs
//    private volatile Map<String, Set<String>> targetUrlsCache = new HashMap<>();
//
//    @Scheduled(fixedRate = 10 * 1000) // 10 秒钟更新一次缓存
//    public void updateTargetUrlsCache() { // 更新目标 URLs
//        // 获取当前应用的机器列表
//        // http://${ip}:${port}
//        Map<String, Set<String>> newTargetUrlsCache = new HashMap<>();
//        discoveryClient.getServices().forEach(serviceName -> {
//            List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);
//            Set<String> newTargetUrls = serviceInstances
//                    .stream()
//                    .map(s ->
//                            s.isSecure() ?
//                                    "https://" + s.getHost() + ":" + s.getPort() :
//                                    "http://" + s.getHost() + ":" + s.getPort()
//                    ).collect(Collectors.toSet());
//            newTargetUrlsCache.put(serviceName, newTargetUrls);
//        });
//
//        this.targetUrlsCache = newTargetUrlsCache;
//    }
//
//
//
//
//    @GetMapping("/invoke/{serviceName}/say") // -> /say
//    public String invokeSay(@PathVariable String serviceName,
//                            @RequestParam String message) {
//        // 服务器列表快照
//        List<String> targetUrls = new ArrayList<>(this.targetUrlsCache.get(serviceName));
//        int size = targetUrls.size();
//        // size =3 , index =0 -2
//        int index = new Random().nextInt(size);
//        // 选择其中一台服务器
//        String targetURL = targetUrls.get(index);
//        // RestTemplate 发送请求到服务器
//        return restTemplate.getForObject(targetURL + "/say?message=" + message, String.class);
//    }
//
//
//    @Bean
//    public RestTemplate restTemplate() {
//        return new RestTemplate();
//    }
//
//}
